package com.sxj.corejava.code08_常用类.String;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author 石小俊
 */
public class Test11_练习 {
    private static Scanner sc = new Scanner(System.in);

    /**
     * 1.控制台输入一个字符串,统计字符串包含多少个数字、英文字母以及其他字符
     */
    public static void test01() {
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        // 由于英文字母区分大小写,可以将同一个字母的大小写作为一个字母
        // 可以先将字符串统一改为大写或者小写
        s = s.toUpperCase();
        // 定义三个变量,分别用于接收数字、英文字母以及其他字符
        int count1 = 0, count2 = 0, count3 = 0;
        // 遍历这个字符串中所有字符
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断字符类型
            if (c >= '0' && c <= '9') {
                count1++;
            } else if (c >= 'A' && c <= 'Z') {
                count2++;
            } else {
                count3++;
            }
        }
        System.out.println("该字符串中包含" + count1 + "个数字," + count2 + "个英文字母," + count3 + "个其他字符");

    }

    /**
     * 2.控制台输入一个字符串,统计每个字母出现的次数(忽略大小写)并输出
     */
    public static void test02() {
        System.out.print("请输入一个字符串:");
        String s = sc.next();
        s = s.toUpperCase();
        // 将该字符串转换成字符数组
        char[] cs = s.toCharArray();
        // 外层循环遍历26个英文字母
        for (char i = 'A'; i <= 'Z'; i++) {
            // 每一个字母定义一个接收出现次数的变量
            int count = 0;
            // 内层循环遍历字符数组,判断字符数组中每一个字符
            for (char c : cs) {
                if (c == i) {
                    count++;
                }
            }
            // 只有出现过的字母才打印
            if (count > 0) {
                System.out.println("字母" + i + "出现了" + count + "次");
            }
        }
    }

    /**
     * 3.控制台输入一个字符串,对字符串中字符进行自然顺序的排序,将排序后的字符串展示出来
     */
    public static void test03() {
        System.out.print("请输入一个字符串:");
        String s = sc.next();
        // 将字符串转换成字符数组
        char[] cs = s.toCharArray();
        // 调用Arrays工具类中提供的排序方法
        Arrays.sort(cs);
        // 将字符数组转换成字符串
        String result = new String(cs);
        System.out.println(result);
    }

    /**
     * 4.控制台输入两个字符串,计算第二个字符串在第一个字符串中出现的次数
     */
    public static void test04() {
        System.out.print("请输入第一个字符串:");
        String s = sc.next();
        System.out.print("请输入第二个字符串:");
        String s2 = sc.next();
        if (s.length() >= s2.length()) {
            // 准备一个变量,用于接收出现的次数
            int count = 0;
            // 定义一个变量,用于接收第二个字符串在第一个字符串中出现的索引位置
            int index = 0;
            while ((index = s.indexOf(s2)) != -1) {
                // 如果满足条件,则说明出现了
                count++;
                // 当找到之后,将第一次出现的子字符串与前面多余的所有字符全部截取掉
                s = s.substring(index + s2.length());
                // 重新进入循环再次判断是否出现
                // 一直到没有出现为止
            }
            if (count > 0) {
                System.out.println("第二个字符串在第一个字符串中出现了" + count + "次");
            } else {
                System.out.println("第二个字符串没有出现在第一个字符串中");
            }
        } else {
            System.out.println("第二个字符串没有出现在第一个字符串中");
        }
    }


    /**
     * 5.在控制台输入一个身份证号码,判断身份证号码格式是否正确
     * 身份证号码只能是15位或者18位字符
     * 如果是15位,要求必须全部是数字
     * 如果是18位,要求前17位必须全部是数字,最后一位可以是数字或者X
     */
    public static void checkPersonId() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个身份证号码:");
        String personId = sc.next();
        if (personId.matches("\\d{15}(\\d{2}[0-9x])?")) {
            System.out.println("提示:身份证号码格式正确");
        } else {
            System.out.println("错误:身份证号码格式不正确,请重新输入!");
            checkPersonId();
        }
    }

    /**
     * 6.在控制台输入一个电子邮箱,判断电子邮箱格式是否正确
     * 要求邮箱必须以英文字母或者数字开头,后面可以跟英文字母数字或者下划线
     * 后面跟@符号,@符号后面跟英文字母或者数字
     * 以.com或者.com.cn结尾
     */
    public static void checkEmail() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个电子邮箱:");
        String email = sc.next();
        if (email.matches("[0-9a-zA-Z]\\w+@[0-9a-zA-Z]+\\.com(\\.cn)?")) {
            System.out.println("提示:电子邮箱格式正确");
        } else {
            System.out.println("错误:电子邮箱格式不正确,请重新输入!");
            checkEmail();
        }
    }


    /**
     * 7.在控制台输入一个用户名,判断用户名格式是否正确
     * 用户名由字母、数字、下划线、点、减号组成,只能以数字字母开头和结尾,长度4-18位
     */
    public static void checkUsername() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个用户名:");
        String username = sc.next();
        if (username.matches("[0-9a-zA-Z][0-9a-zA-Z_.-]{2,12}[0-9a-zA-Z]")) {
            System.out.println("提示:用户名格式正确");
        } else {
            System.out.println("错误:用户名格式不正确,请重新输入!");
            checkUsername();
        }
    }

    public static void main(String[] args) {
        checkUsername();
    }
}
